package mx.unam.fciencias.ActividadesCulturales.services.DAO;

import java.util.List;
import mx.unam.fciencias.ActividadesCulturales.commons.Util;
import mx.unam.fciencias.actividadesculturales.entidades.portal.UsuarioSistema;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

/**
 * Capa de datos de la entidad usuario.
 * @author lumartin
 */
public class UsuarioSistemaDAO extends GenericDAO {

    /**
     * Obtiene usuarios.
     * @param nombreOusuario El nombre o el usuario que se busca.
     * @return Los usuarios que concuerdan con <code>nombreOusuario</code>.
     */
    public List<UsuarioSistema> getUsuarios(String nombreOusuario) {
        Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();

        Criteria crit = session.createCriteria(UsuarioSistema.class);
        if (nombreOusuario == null) {
            nombreOusuario = "";
        }
        crit.add(Restrictions.or(Restrictions.eq("username", nombreOusuario),
                Restrictions.ilike("nombreCompleto", nombreOusuario,
                MatchMode.ANYWHERE)));
        return crit.list();
    }
    
    /**
     * Obtiene todos los usuarios que concuerden con los campos usuario, contraseña,
     * nombre, o usuarioActivo. Si todos los parámetros son nulos, regresa
     * todos los usuarios registrados.
     * @param username Usuario.
     * @param passwd Contraseña.
     * @param nombre Nombre del usuario.
     * @param activo Usuario activo?
     * @return Los usuarios que concuerdan con las restricciones dadas.
     */
    public List<UsuarioSistema> getUsuarios(String username, String passwd,
            String nombre, Boolean activo) {

        Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
        Criteria crit = session.createCriteria(UsuarioSistema.class);

        if (username != null) {
            crit.add(Restrictions.eq("username", username));
        }
        if (passwd != null) {
            crit.add(Restrictions.eq("passwd", Util.getMD5(passwd)));
        }
        if (nombre != null) {
            crit.add(Restrictions.ilike("nombreCompleto", nombre,
                    MatchMode.ANYWHERE));
        }
        if (activo != null) {
            crit.add(Restrictions.eq("usuarioActivo", true));
        }
        
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return crit.list();
    }

    /**
     * Busca a un usuario a partir de su correo o nombre de usuario.
     * @param email correo.
     * @param username usuario
     * @return el usuario de sistema.
     */
    public UsuarioSistema busca(String email, String username) {
        Criteria crit = getSesionDAO().createCriteria(UsuarioSistema.class);
        if (email != null) {
            crit.add(Restrictions.ilike("email", email));
            return (UsuarioSistema) crit.uniqueResult();
        }

        if (username != null) {
            crit.add(Restrictions.eq("username", username));
            return (UsuarioSistema) crit.uniqueResult();
        }
        return null;
    }

    /**
     * Obtiene usuario por ID.
     * @param usuarioID Id del usaurio.
     * @return El usuario que concuerda con el Id.
     */
    public UsuarioSistema getUsuario(long usuarioID) {
        return (UsuarioSistema) super.getById(UsuarioSistema.class, usuarioID);
    }

    /**
     * Almacena los cambios realizados a un usuario.
     * @param usuario Objecto {@link UsuarioSistema} que se almacena.
     * @return true si no existión error.
     */
    public boolean guardar(UsuarioSistema usuario) {
        return super.guardar(usuario);
    }
}
